热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

放入|教室_onvif协议+高性能rtspclient打通大屏投屏协议

篇首语:本文由编程笔记#小编为大家整理,主要介绍了onvif协议+高性能rtspclient打通大屏投屏协议相关的知识,希望对你有一定的参考价值。1、onvif

篇首语:本文由编程笔记#小编为大家整理,主要介绍了onvif协议+高性能rtspclient打通大屏投屏协议相关的知识,希望对你有一定的参考价值。



1、onvif协议

  1.1 onvif简述和作用

a) 搜索列表
onvif协议本身是一个非常好的协议,帮助打通网内所有视频,搜索,播放和控制都是可以的。
b) 如何搜索
使用多播协议,以前写过很多多播的文章可以看,读者可以查看我其他文章,我是使用多播协议,因为正好,搜索所有大屏也需要使用多播协议,例如ssdp协议,而实际上onvif使用的是多播和soap,打通的流程过程就是同时搜索大屏和onvif,将两种设备放入到各自的列表,
c) 融合
这里又有另外一种模式了,就是我们的客户希望大屏作为一个融合过后的投屏,而不是一个一个地投上去,毕竟,投屏协议同时只支持一路视频,那么如何做呢,以下就是做法


  1.2 制作高性能rtspclient

为什么要rtspclient,因为onvif协议需要,抓住设备列表以后获取协议地址,然后开始做融合,问题是性能,rtsp拉流是比较耗性能和线程的,所以如果使用其他比如ffmpeg或者live555 等不符合要求。
任何高性能的客户端只能自己制作,使用单一进程联结多路,或者使用多进程联结多路,这个需要指挥调度,问题是我们需要视频融合做mcu,所以,使用单一进程是最好的,同时联结9路画到一个虚拟屏幕里,硬件解码,再重新硬件进行一路融合编码,发送到服务器,以下是rtspclient 伪代码

int options( sock and string)

cout << &#61;&#61;&#61;&#61;&#61;&#61;<<"OPTIONS"<<&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; << endl;
char sendBuf[2048];
snprintf(sendBuf, 1024,
"OPTIONS rtsp://1.1.1.1:554/Streaming/Channels/101?transportmode&#61;unicast&profile&#61;Profile_1 RTSP/1.0\\r\\n"
"CSeq: 2\\r\\n"
"User-Agent: qianbo/3.0.12 (18091589062)\\r\\n"
"\\r\\n");
//printf("sendBuf :\\n%s\\n", sendBuf);
sendto(sock, sendBuf, strlen(sendBuf), 0, (sockaddr*)&sockAddr, sizeof(sockAddr));
return 0;

void describe(sock and string)

//发送describe返回401 安全需要认证机制
cout << &#61;&#61;&#61;&#61;&#61;&#61;<<"DESCRIBE"<<&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; << endl;
char sendBuf[2048];
snprintf(sendBuf, 2048,
"DESCRIBE rtsp://1.1.1.1:554/Streaming/Channels/101?transportmode&#61;unicast&profile&#61;Profile_1 RTSP/1.0\\r\\n"
"CSeq: 3\\r\\n"
"User-Agent: qianbo/1.1.1 (18091589062)\\r\\n"
"Accept: application/sdp\\r\\n"
"\\r\\n");
//printf("sendBuf :\\n%s\\n", sendBuf);
sendto(sock, sendBuf, strlen(sendBuf), 0, (sockaddr*)&sockAddr, sizeof(sockAddr));
return 0;

int describe_authorization(sock and address, char *realm, char *nonce, const char *response)

//返回401时需要客户端认证
cout << "DESCRIBE_AUTHORIZATION" << endl;
char sendBuf[2048];
snprintf(sendBuf, 2048,
"DESCRIBE rtsp://1.1.1.1:554/Streaming/Channels/101?transportmode&#61;unicast&profile&#61;Profile_1 RTSP/1.0\\r\\n"
"CSeq: 4\\r\\n"
"Authorization: Digest username&#61;\\"admin\\", realm&#61;\\"%s\\", nonce&#61;\\"%s\\", uri&#61;\\"rtsp://192.168.8.250:554/Streaming/Channels/101?transportmode&#61;unicast&profile&#61;Profile_1\\", response&#61;\\"%s\\"\\r\\n"
"User-Agent: qianbo/1.1.1 (18091589062)\\r\\n"
"Accept: application/sdp\\r\\n"
"\\r\\n",
realm, nonce, response);
return sendto(sock, sendBuf, strlen(sendBuf), 0, (sockaddr*)&sockAddr, sizeof(sockAddr));


int setup(SOCKET& sock, sockaddr_in& sockAddr, char* realm, char* nonce, const char* response)

cout << "SETUP" << endl;
char sendBuf[2048];
snprintf(sendBuf, 2048,
"SETUP rtsp://192.168.8.250:554/Streaming/Channels/101/trackID&#61;1?transportmode&#61;unicast&profile&#61;Profile_1 RTSP/1.0\\r\\n"
"CSeq: 5\\r\\n"
"Authorization: Digest username&#61;\\"admin\\", realm&#61;\\"%s\\", nonce&#61;\\"%s\\", uri&#61;\\"rtsp://192.168.8.250:554/Streaming/Channels/101/\\", response&#61;\\"%s\\"\\r\\n"
"User-Agent: qianbo/1.1.1 (18091589062)\\r\\n"
"Transport: RTP/AVP;unicast;client_port&#61;23332-23333\\r\\n"
"\\r\\n",
realm, nonce, response);
return sendto(sock, sendBuf, strlen(sendBuf), 0, (sockaddr*)&sockAddr, sizeof(sockAddr));

int play(SOCKET& sock, sockaddr_in& sockAddr, char* realm, char* nonce, const char* response, char *session)

cout << "PLAY" << endl;
char sendBuf[2048];
snprintf(sendBuf, 2048,
"PLAY rtsp://192.168.8.250:554/Streaming/Channels/101?transportmode&#61;unicast&profile&#61;Profile_1 RTSP/1.0\\r\\n"
"CSeq: 6\\r\\n"
"Authorization: Digest username&#61;\\"admin\\", realm&#61;\\"%s\\", nonce&#61;\\"%s\\", uri&#61;\\"rtsp://192.168.8.250:554/Streaming/Channels/101/\\", response&#61;\\"%s\\"\\r\\n"
"User-Agent: qianbo/1.1.1 (18091589062)\\r\\n"
"Session: %s\\r\\n"
"Range: npt&#61;0.000-\\r\\n"
"\\r\\n",
realm, nonce, response, session);
return sendto(sock, sendBuf, strlen(sendBuf), 0, (sockaddr*)&sockAddr, sizeof(sockAddr));

int teardown(SOCKET& sock, sockaddr_in& sockAddr, char* realm, char* nonce, const char* response, char* session)

cout <<"TEARDOWN"" << endl;
char sendBuf[2048];
snprintf(sendBuf, 2048,
"TEARDOWN rtsp://192.168.8.250:554/Streaming/Channels/101/?transportmode&#61;unicast&profile&#61;Profile_1 RTSP/1.0\\r\\n"
"CSeq: 7\\r\\n"
"Authorization: Digest username&#61;\\"admin\\", realm&#61;\\"%s\\", nonce&#61;\\"%s\\", uri&#61;\\"rtsp://192.168.8.250:554/Streaming/Channels/101/\\", response&#61;\\"%s\\"\\r\\n"
"User-Agent: qianbo (18091589062)\\r\\n"
"Session: %s\\r\\n"
"\\r\\n",
realm, nonce, response, session);
return sendto(sock, sendBuf, strlen(sendBuf), 0, (sockaddr*)&sockAddr, sizeof(sockAddr));


1.3 onvif 探针

需要向网络中发送soap包探听

int sendProbe(int fd,const char *uuid,const char *types)

int r;
struct sockaddr_in srv;
memset( &srv, 0, sizeof(struct sockaddr_in) );
srv.sin_family &#61; AF_INET;
srv.sin_port &#61; htons(PUERTO);
srv.sin_addr.s_addr &#61; inet_addr(GRUPO);

char Probe[4096];
sprintf(Probe,""\\
""\\
""\\
"%s"\\
"urn:schemas-xmlsoap-org:ws:2005:04:discovery"\\
"http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe"\\
""\\
""\\
""\\
"%s"\\
""\\
""\\
""\\
"\\r\\n",uuid,types);
if( (r &#61; sendto(fd, Probe, strlen(Probe), 0, (struct sockaddr *)&srv, sizeof(srv))) < 0 )

cout<<"sendto failed"<<endl;
closesocket(fd);
return -1;

return 0;


2 投屏协议

读者可以参考我的其他投屏协议的文章&#xff0c;实际上投屏协议需要一个服务器&#xff0c;大部分大屏是支持各类协议&#xff0c;我们制作通用的rtsp服务器就行&#xff0c;使用tcp方式发送rtp&#xff0c;这样防止服务器在外网&#xff0c;而大屏在内网。
服务器在外网的时候有一个好处&#xff0c;就是可以将内网的视频传送到另外一个地方的大屏中&#xff0c;这是可以的。但是需要一个寻找大屏和通知大屏的内网代理&#xff0c;这个以后说。


3 发送和通知

需要使用ssdp等协议发送刚才融合的视频&#xff0c;把地址给到大屏&#xff0c;如果同时投屏到多个&#xff0c;那么多个大屏会同时播放融合的视频&#xff0c;这种方案还可以使用到教学种&#xff0c;可以将教学视频同时投放到多个教室。

后面的几节会具体讲述各个过程的具体实现&#xff0c;未完待续…


推荐阅读
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 本文探讨了C语言和C++中大小写的处理方式,并详细介绍了如何在C++中实现不区分大小写的字符串比较。通过自定义`char_traits`类,可以灵活地处理字符的比较、复制和转换。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
author-avatar
wo1344165221
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有